import pandas as pdimport numpy as np import matplotlib.pyplot as pltimport seaborn as sns df = pd.read_csv("data.csv")df.head() df.shapedf.dtypesdf.describe() df.isnull().sum()sns.heatmap(corr) sns.pairplot(num_df)df.select_dtypes('number') df.groupby("col").mean()
Bioestadística Aplicada · Python · Sesión de Datos

Pandas · NumPy
Matplotlib · Seaborn

Introducción práctica al ecosistema de análisis de datos en Python — desde cargar un dataset hasta visualizaciones avanzadas como heatmaps y pair plots.

🐼 pandas 🔢 numpy 📊 matplotlib 🎨 seaborn
Dataset de la sesión
yamaerenay/mbtitypes-full · Kaggle
countries.csv · types.csv

Dataset: MBTI Types Full · Kaggle (yamaerenay)

00
Diapositiva 02 · Objetivos
Al terminar esta sesión podrás…
1
Explicar qué es un dataset y cómo una tabla estructurada permite almacenar, organizar y analizar información estadística de forma sistemática.
2
Identificar la estructura de un DataFrame: dimensiones, columnas, tipos de datos, valores faltantes y duplicados usando pandas.
3
Calcular estadísticos descriptivos (media, mediana, desviación estándar, cuartiles, rango intercuartílico) sobre columnas numéricas.
4
Detectar y entender los valores atípicos (outliers) utilizando la regla IQR y visualizarlos con boxplots e histogramas.
5
Crear visualizaciones avanzadas con matplotlib y seaborn: gráficas de barras, histogramas, heatmaps de correlación y pair plots.
💾
Diapositiva 03 · Concepto base
¿Qué es un dataset? — La materia prima del análisis
💡 Definición
Un dataset (conjunto de datos) es una colección estructurada de información organizada en filas (observaciones / registros) y columnas (variables / características). Permite almacenar, compartir y procesar grandes volúmenes de información de forma reproducible.
📐 Anatomía de un dataset
CountryINTJINTPINFJ
Mexico0.0420.0380.051
USA0.0390.0450.049
Japan0.0280.0310.047
Vocabulario esencial
fila = observación columna = variable
celda = valor NaN = valor faltante
🌐 Nuestro dataset de la sesión
🧠
MBTI Types Full · Kaggle
countries.csv: Distribución de los 16 tipos de personalidad MBTI por país del mundo.

types.csv: Información descriptiva de cada tipo de personalidad.
¿Por qué usar datasets?
  • Reproducibilidad — cualquiera puede verificar tus resultados
  • Escala — analiza miles de filas en segundos con código
  • Trazabilidad — historial de transformaciones documentado
01
Diapositiva 04 · Step 1
Importar librerías y configurar el entorno
python · importaciones import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # Verificar versiones instaladas print(f"pandas: {pd.__version__}") print(f"numpy: {np.__version__}") print(f"matplotlib: {plt.matplotlib.__version__}") print(f"seaborn: {sns.__version__}") # Configuración de visualización sns.set_theme(style="whitegrid") plt.rcParams["figure.dpi"] = 120
output pandas: 2.2.3 numpy: 1.26.4 matplotlib: 3.9.0 seaborn: 0.13.2
📦 ¿Qué hace cada librería?
🐼
pandas — estructuras de datos
Trabaja con datos tabulares: DataFrame y Series. Lee CSV, Excel, SQL. Filtra, agrupa, transforma. Es el "Excel programable" de Python.
🔢
numpy — computación numérica
Arrays multidimensionales de alta performance. Base de todo el ecosistema científico de Python. Operaciones vectorizadas sin bucles.
📊
matplotlib — gráficas base
Motor de visualización fundamental. Control total sobre cada elemento del gráfico. Interfaz estilo MATLAB.
🎨
seaborn — visualización estadística
Construido sobre matplotlib. Gráficas estadísticas con una sola línea. Integración directa con DataFrames de pandas.
02
Diapositiva 05 · Step 2
Exploración inicial — dimensiones, tipos y primeras filas
python · exploración del dataframe # Dimensiones del dataset print(f"Filas: {df.shape[0]} | Columnas: {df.shape[1]}") # Tipos de datos por columna print(df.dtypes) # Primeras 5 filas del DataFrame df.head() # Resumen completo de info df.info() # Nombres de las columnas df.columns
output ejemplo Filas: 74 | Columnas: 17 Country object INTJ float64 INTP float64 ...
🔍 Funciones y atributos clave
Expresión¿Qué hace?
df.shape(n_filas, n_cols) — dimensiones
df.dtypesTipo de dato por columna
df.head(n)Primeras n filas (defecto: 5)
df.tail(n)Últimas n filas
df.info()Resumen: tipos + no-nulos
df.columnsLista de nombres de columnas
Tipos de datos comunes en pandas
int64 enteros   float64 decimales   object texto/strings   bool verdadero/falso
03
Diapositiva 06 · Step 3–4
Calidad de datos — NaN, duplicados y valores únicos
python · detección de problemas # ¿Hay valores faltantes (NaN)? areThereNaN = df.isnull().values.any() # ¿Hay países duplicados? hayDuplicados = df["Country"].duplicated().any() # Contar frecuencia de cada país conteo = df["Country"].value_counts() # Mostrar solo los que aparecen más de 1 vez conteo[conteo > 1] print("¿Hay NaN?", areThereNaN) print("¿Hay duplicados?", hayDuplicados)
⚠️ ¿Por qué importa la calidad de datos?
NaN — Not a Number
Celdas sin valor. Los estadísticos (media, std) los ignoran por defecto, pero pueden sesgar resultados si abundan. Opciones: eliminar filas (dropna), rellenar (fillna) o interpolar.
Duplicados
Filas idénticas inflan el análisis y sesgan las distribuciones. Se detectan con .duplicated() y se eliminan con .drop_duplicates().
value_counts()
Devuelve la frecuencia de cada valor único. Fundamental para variables categóricas como el nombre de un país o tipo de personalidad. muy usado en exploración
04
Diapositiva 07 · Step 5
Estadísticos descriptivos — resumir numéricamente los datos
python · tabla de estadísticos # Seleccionar solo columnas numéricas num = df.select_dtypes(include='number') descriptivos = { "Media": num.mean(), "Mediana": num.median(), "Moda": num.mode().iloc[0], "Desv. Estándar": num.std(), "Varianza": num.var(), "Máximo": num.max(), "Mínimo": num.min(), "Rango": num.max() - num.min(), "Q1 (25%)": num.quantile(0.25), "Q3 (75%)": num.quantile(0.75), "IQR": num.quantile(0.75) - num.quantile(0.25), } pd.DataFrame(descriptivos)
📊 ¿Qué mide cada estadístico?
EstadísticoMétodo pandasMide
Media (x̄).mean()Promedio aritmético
Mediana.median()Valor central
Moda.mode().iloc[0]Valor más frecuente
Desv. estándar (s).std()Dispersión
Q1 / Q3.quantile(0.25/0.75)Cuartiles 25% y 75%
IQRQ3 − Q1Rango intercuartílico
select_dtypes(include='number')
Filtra automáticamente solo las columnas de tipo int64 y float64. Esencial para aplicar operaciones matemáticas sin errores por columnas de texto.
05
Diapositiva 08 · Step 7
Valores atípicos (outliers) — regla del IQR
python · detección de outliers con IQR Q1 = num.quantile(0.25) Q3 = num.quantile(0.75) IQR = Q3 - Q1 # Límites de detección limInf = Q1 - 1.5 * IQR limSup = Q3 + 1.5 * IQR # Contar cuántos valores caen fuera bajoLimInf = (num < limInf).sum() sobreLimSup = (num > limSup).sum() pd.DataFrame({ "Límite inferior": limInf, "Límite superior": limSup, "Bajo el límite": bajoLimInf, "Sobre el límite": sobreLimSup, })
📐 La regla del IQR explicada
¿Qué es un outlier?
Un valor que cae muy lejos del rango "normal" de los datos. La regla del IQR es robusta: define outliers como valores que están más de 1.5 × IQR por encima de Q3 o por debajo de Q1.
Fórmulas
Límite inferior = Q1 − 1.5 × IQR
Límite superior = Q3 + 1.5 × IQR

Valores fuera de estos límites son candidatos a outliers.
¿Eliminar o conservar?
Depende del contexto. Un outlier puede ser un error de captura (eliminar) o un dato genuinamente extremo pero real (conservar). El análisis estadístico debe justificar la decisión.
06
Diapositiva 09 · Step 8
Boxplot e histograma — visualizar distribuciones
python · boxplot con seaborn num_df = df.select_dtypes(include='number') plt.figure() sns.boxplot(data=num_df) plt.xticks(rotation=45) plt.show()
python · histograma con kde por columna cols = num_df.columns colors = sns.color_palette("husl", len(cols)) for i, col in enumerate(cols): sns.histplot(num_df[col], kde=True, ax=axes[i], color=colors[i]) axes[i].set_title(col) plt.tight_layout()
📊 ¿Qué nos dicen estas gráficas?
📦
Boxplot (diagrama de caja)
Muestra Q1, mediana (Q2), Q3, bigotes (1.5×IQR) y outliers como puntos. De un vistazo: dispersión, simetría y valores extremos por variable.
📈
Histograma + KDE
El histograma muestra la frecuencia de valores en rangos (bins). La curva KDE (Kernel Density Estimate) es una estimación continua de la distribución de probabilidad.
plt vs sns
matplotlib da control total pero requiere más código.
seaborn genera gráficas estadísticas elegantes con una línea. Ambas son complementarias — seaborn construye sobre matplotlib.
07
Diapositiva 10 · Step 9
Gráficas de barras — comparar filas específicas
python · perfil de un país # Filtrar la fila de México row_num = num_df.loc[df["Country"] == "Mexico"].iloc[0] row_num.plot(kind="bar") plt.title("Distribución de Personalidad — México") plt.xticks(rotation=45) plt.show()
python · comparar múltiples países paises = ["Mexico", "United States", "Japan", "Colombia"] subset = df[df["Country"].isin(paises)] num_df.index = subset["Country"] # Mismo ylim para comparar entre países axes[i].set_ylim(0, 0.15) # ← IMPORTANTE
💡 Conceptos importantes de filtrado
.loc[ ] y .iloc[ ]
.loc[condición] — filtra por etiqueta/condición booleana
.iloc[0] — selecciona por posición entera (índice 0 = primera fila)
.isin(lista)
Filtra filas donde la columna contiene alguno de los valores de la lista. Equivalente a escribir múltiples condiciones OR.
set_ylim() — eje Y fijo
Al comparar múltiples gráficas, fijar el mismo límite del eje Y garantiza una comparación visual justa. Sin esto, cada gráfica ajusta su propia escala y la comparación es engañosa.
08
Diapositiva 11 · Step 10
Heatmap de correlación — relaciones entre variables
python · heatmap de correlación num_df = df.select_dtypes(include='number') # Calcular matriz de correlación corr = num_df.corr() plt.figure(figsize=(10, 8)) sns.heatmap( corr, cmap="coolwarm", center=0 ) plt.title("Correlación entre Tipos de Personalidad") plt.show()
🔥 Entendiendo el heatmap
¿Qué es la correlación?
Mide la relación lineal entre dos variables. Va de −1 (inversa perfecta) a +1 (directa perfecta). 0 = sin relación lineal.
ColorCorrelaciónSignificado
🔴 Rojo intensor ≈ +1Relación positiva fuerte
⬜ Blanco/neutror ≈ 0Sin relación lineal
🔵 Azul intensor ≈ −1Relación negativa fuerte
Parámetros clave de sns.heatmap
cmap="coolwarm" paleta azul-blanco-rojo
center=0 centra la escala en 0
annot=True muestra valores numéricos en cada celda
09
Diapositiva 12 · Step 11
Pair Plot — la visualización más densa y poderosa
python · pair plot # Una sola línea — crea una matriz completa # de gráficas de dispersión y distribuciones sns.pairplot(num_df) plt.show() # Variante con color por grupo sns.pairplot( df, hue="Country", diag_kind="kde", plot_kws={"alpha": 0.4} )
⚠️ Nota de rendimiento
Con muchas columnas (> 10), el pair plot puede tardar varios minutos en generarse. Considera usar un subconjunto de columnas con pairplot(data[["col1","col2","col3"]]).
🔭 ¿Qué muestra el pair plot?
🔲
Matriz n×n de gráficas
Para cada par de variables: un scatter plot que muestra su relación. En la diagonal: la distribución de esa variable (histograma o KDE). Con n columnas → n² gráficas.
🔍
¿Qué buscar?
Patrones lineales → correlación. Grupos separados → estructura de clúster. Forma de abanico → varianza no constante (heterocedasticidad). Puntos aislados → outliers multivariados.
Exploratorio, no confirmatorio
El pair plot es una herramienta de exploración inicial. Las relaciones que identifica visualmente deben confirmarse con pruebas estadísticas formales (correlación de Pearson, regresión, etc.).
?
Diapositiva 13 · Comprensión
Preguntas de comprensión conceptual
P1
¿Cuál es la diferencia conceptual entre .loc[] y .iloc[]?
  • a .loc[] es más rápido que .iloc[] para datasets grandes
  • b ✓ .loc[] filtra por etiqueta o condición booleana; .iloc[] filtra por posición entera
  • c Son idénticos — solo cambia la sintaxis
P2
Si un heatmap muestra color azul intenso entre dos variables, ¿qué indica?
  • a Correlación positiva fuerte (r ≈ +1)
  • b ✓ Correlación negativa fuerte (r ≈ −1): cuando una sube, la otra baja
  • c Que los datos son categóricos y no tienen correlación
P3
¿Por qué se usa set_ylim(0, 0.15) al comparar múltiples países en gráficas separadas?
  • a Para ahorrar memoria — las gráficas pesan menos
  • b ✓ Para garantizar una escala idéntica en todas las gráficas y que la comparación visual sea justa y no engañosa
  • c Porque seaborn no ajusta automáticamente el eje Y
P4
¿Qué muestra la diagonal del pair plot?
  • a La correlación numérica entre esa variable y todas las demás
  • b ✓ La distribución de esa variable con ella misma — un histograma o curva KDE
  • c Una línea de regresión de la variable consigo misma
P5
¿Cuál es la fórmula correcta del límite superior de la regla IQR para detección de outliers?
  • a Q3 + 2 × IQR
  • b ✓ Q3 + 1.5 × IQR, donde IQR = Q3 − Q1
  • c Mediana + 2 × Desviación estándar
P6
¿Qué hace df.select_dtypes(include='number')?
  • a Devuelve una columna con todos los números del DataFrame
  • b ✓ Filtra y devuelve solo las columnas de tipo numérico (int64, float64) del DataFrame
  • c Convierte todas las columnas al tipo numérico automáticamente
df.corr()sns.heatmap(corr, cmap="coolwarm") sns.pairplot(num_df)df.isnull().any() df.select_dtypes('number').describe() Q1, Q3 = df.quantile([0.25, 0.75])
✅ Sesión completada

Flujo de trabajo completo

Step 1
import pandas, numpy, matplotlib, seaborn — verificar versiones y configurar tema.
Step 2
df.shape · df.dtypes · df.head() · df.info() · df.columns — conocer la estructura.
Step 3
df.isnull() · df.duplicated() · df.value_counts() — auditar la calidad de los datos.
Step 4
mean · median · mode · std · var · quantile · IQR — describir numéricamente.
Step 5
Regla IQR: límite inferior = Q1−1.5×IQR · límite superior = Q3+1.5×IQR → outliers.
Step 6
sns.boxplot() · sns.histplot(kde=True) · .plot(kind="bar") — visualizar distribuciones.
Step 7
df.corr() + sns.heatmap() — matrix de correlación con escala de color coolwarm.
Step 8
sns.pairplot() — visualización exploratoria completa de todas las relaciones entre variables.
DATASET
yamaerenay. MBTI Types Full. Kaggle, 2024.
Distribución de tipos de personalidad MBTI por país del mundo.
kaggle.com/datasets/yamaerenay/mbtitypes-full